struct blkmark {
    void * addr;
    uint sz; // 块大小,即free表下标
    uint64 tag;
    struct blkmark * next;
};

#define MAX_NRTAG 0x8000000000000000U
#define MAX_BLKSZ 0x200000 // 2M
#define NR_SBHHD 22 // 链表个数
#define NR_HASHHD 4096 // 哈希表表头数量
struct sxbh {
    uint flg; // flg==0:未初始化 flg==1:已初始化
    void * xmem;
    uint blknm;
    // mark[21] <- 2M Block, 1 << 21 = 2M
    /* 伙伴系统
     * free标识可用项
     * alloc标识已分配项
     * free标识1<<i大小的block. 链表从[6]即64B到[21]即2M
     * alloc是个哈希表,维护地址到已分配blkmark的映射
     */
    struct blkmark free[NR_SBHHD];
    struct blkmark alloc[NR_HASHHD];
    uint64 nxtag; // 下一个可使用tag
};

struct varh {
    uint flg; // flg==0:未初始化 flg==1:已初始化
    void * heap;
    uint blknm;
    struct blkmark free[NR_SBHHD];
    struct blkmark alloc[NR_HASHHD];
    uint64 nxtag;
};